clear; close all; clc;
%                               《图像处理》实验 十 报告

%          姓名：邓烨   学号： 22209020061
%          姓名：李生院   学号： 22209020033

%  [Matlab版本(不高于2019b)]：
%   R2010b

%【实验目的】：
%一、对彩色图像进行平滑
%二、对彩色图像进行锐化
%三、彩色图像的双线性插值放大

%【实验内容】：
%一、运用Matlab对彩色图像进行平滑
%1、在一个figure中的第一行显示RGB空间中的R、G、B三个分量，在第二行显示HSV空间中的H、S、V三个分量（用 rgb2hsv 、 hsv2rgb 进行彩色空间的转换），并做适当的标注
% 读取图像
I = imread('baboon.tif');

% 分离RGB分量
R = I(:,:,1);
G = I(:,:,2);
B = I(:,:,3);

% 转换到HSV空间
Ihsv = rgb2hsv(I);
H = Ihsv(:,:,1) * 360; 
S = Ihsv(:,:,2);
V = Ihsv(:,:,3);

% 创建figure
figure;

% 显示RGB分量
subplot(2,3,1), imshow(R), title('R分量');
subplot(2,3,2), imshow(G), title('G分量');
subplot(2,3,3), imshow(B), title('B分量');

% 显示HSV分量
subplot(2,3,4), imshow(H), title('H分量');
subplot(2,3,5), imshow(S), title('S分量');
subplot(2,3,6), imshow(V), title('V分量');
%2、分别以邻域尺寸2×2，3×3，4×4，参照第11章ppt中的例子对原始图像在RGB空间进行邻域平均，对HSV空间中的三个分量进行邻域平均；仅对HSV 空间中的V分量进行邻域平均，比较三种方法效果的差异。在1个figure中显示原始图像、RGB空间滤波结果彩色图像(3×3)、HSV 空间三个分量滤波结果彩色图像(3×3)、HSV 空间V分量滤波结果彩色图像(3×3)，并做适当标注
% 定义邻域尺寸
filter_sizes = [2 3 4];

% 创建figure
figure;

% 显示原始图像
subplot(2,4,1), imshow(I), title('原始图像');

% 对RGB空间进行邻域平均
for i = 1:length(filter_sizes)
    filter = fspecial('average', filter_sizes(i));
    I_rgb_avg = imfilter(I, filter, 'replicate');
    subplot(2,4,i+1), imshow(I_rgb_avg), title(['RGB空间3x3滤波']);
end

% 对HSV空间进行邻域平均
for i = 1:length(filter_sizes)
    Ihsv_avg = imfilter(Ihsv, filter, 'replicate');
    I_hsv_avg = hsv2rgb(Ihsv_avg);
    subplot(2,4,i+5), imshow(I_hsv_avg), title(['HSV空间3x3滤波']);
end

% 仅对HSV空间中的V分量进行邻域平均
Ihsv_v_avg = Ihsv;
for i = 1:length(filter_sizes)
    Ihsv_v_avg(:,:,3) = imfilter(V, filter, 'replicate');
    I_v_avg = hsv2rgb(Ihsv_v_avg);
    subplot(2,4,i+9), imshow(I_v_avg), title(['HSV空间V分量3x3滤波']);
end
%二、运用Matlab对彩色图像进行锐化
%1、参照“实验五”，利用 fspecial , imfilter 对原始图像在RGB空间进行锐化；对HSV空间中的三个分量进行锐化；仅对HSV 空间中的V分量进行锐化，比较这三种锐化方法的差异。在1个figure中显示原始图像、RGB空间锐化结果彩色图像、HSV 空间三个分量锐化结果彩色图像、HSV 空间V分量锐化结果彩色图像，并做适当标注
% 读取原始彩色图像
original_image = imread('baboon.tif');

% 转换为double类型以进行处理
original_image = im2double(original_image);

% 创建拉普拉斯算子用于锐化
laplacian_filter = fspecial('laplacian', 0.2); % alpha参数控制锐化强度

% 1. RGB空间锐化
% 分离RGB三个分量
R = original_image(:, :, 1);
G = original_image(:, :, 2);
B = original_image(:, :, 3);

% 对每个分量分别进行锐化
sharpened_R = imfilter(R, laplacian_filter, 'replicate') + R;
sharpened_G = imfilter(G, laplacian_filter, 'replicate') + G;
sharpened_B = imfilter(B, laplacian_filter, 'replicate') + B;

% 合并锐化后的分量
sharpened_RGB = cat(3, sharpened_R, sharpened_G, sharpened_B);

% 2. HSV空间三个分量锐化
% 将图像转换到HSV空间
hsv_image = rgb2hsv(original_image);

% 分离HSV的H, S, V分量
H = hsv_image(:, :, 1);
S = hsv_image(:, :, 2);
V = hsv_image(:, :, 3);

% 对H, S, V分量分别进行锐化
sharpened_H = imfilter(H, laplacian_filter, 'replicate') + H;
sharpened_S = imfilter(S, laplacian_filter, 'replicate') + S;
sharpened_V = imfilter(V, laplacian_filter, 'replicate') + V;

% 合并锐化后的分量并转换回RGB空间
sharpened_HSV = cat(3, sharpened_H, sharpened_S, sharpened_V);
sharpened_HSV = hsv2rgb(sharpened_HSV);

% 3. 仅对HSV空间的V分量进行锐化
% 转换到HSV空间
hsv_image_V_only = rgb2hsv(original_image);

% 只对V分量进行锐化
sharpened_V_only = imfilter(hsv_image_V_only(:, :, 3), laplacian_filter, 'replicate') + hsv_image_V_only(:, :, 3);
hsv_image_V_only(:, :, 3) = sharpened_V_only;

% 转换回RGB空间
sharpened_HSV_V_only = hsv2rgb(hsv_image_V_only);

% 显示结果
figure;
subplot(2, 2, 1);
imshow(original_image);
title('原始图像');

subplot(2, 2, 2);
imshow(sharpened_RGB);
title('RGB空间锐化结果');

subplot(2, 2, 3);
imshow(sharpened_HSV);
title('HSV三个分量锐化结果');

subplot(2, 2, 4);
imshow(sharpened_HSV_V_only);
title('HSV:V分量锐化结果');
%三、彩色图像的双线性插值放大
%1、不用imresize, 参阅“实验三”的内容，自行编程利用循环将彩色图像baboon 以bilinear方式缩放q倍(q为任一大于零的正实数)，并显示
% 读取原始彩色图像
original_image = imread('baboon.tif');

% 转换为double类型以进行处理
original_image = im2double(original_image);

% 获取原始图像的尺寸
[rows, cols, ~] = size(original_image);

% 定义缩放因子q
q = 3;

% 计算新图像的尺寸
new_rows = round(rows * q);
new_cols = round(cols * q);

% 初始化新图像
resized_image = zeros(new_rows, new_cols, size(original_image, 3));

% 双线性插值缩放
for i = 1:new_rows
    for j = 1:new_cols
        % 计算在原始图像中对应的位置
        x = (j - 0.5) / q;
        y = (i - 0.5) / q;
        
        % 找到最近的四个像素点
        x1 = floor(x);
        y1 = floor(y);
        x2 = x1 + 1;
        y2 = y1 + 1;
        
        % 确保索引在图像边界内
        x1 = max(1, min(x1, cols-1));
        x2 = max(1, min(x2, cols-1));
        y1 = max(1, min(y1, rows-1));
        y2 = max(1, min(y2, rows-1));
        
        % 获取四个像素点的值
        Q11 = original_image(y1, x1, :);
        Q12 = original_image(y1, x2, :);
        Q21 = original_image(y2, x1, :);
        Q22 = original_image(y2, x2, :);
        
        % 双线性插值
        R1 = (x2 - x) * Q11 + (x - x1) * Q12;
        R2 = (x2 - x) * Q21 + (x - x1) * Q22;
        resized_image(i, j, :) = (y2 - y) * R1 + (y - y1) * R2;
    end
end

% 显示原始图像和缩放后的图像
figure;
subplot(1, 2, 1);
imshow(original_image);
title('原始图像');

subplot(1, 2, 2);
imshow(resized_image);
title(['缩放3倍后的图像']);
